-- 推送礼包
local Lang = require("common.Lang")
local Msg = require("core.Msg")
local ObjHuman = require("core.ObjHuman")
local BagLogic = require("bag.BagLogic")
local Grid = require("bag.Grid")
local Broadcast = require("broadcast.Broadcast")
local PresentExcel = require("excel.present")
local Util = require("common.Util")
local BuyLogic = require("topup.BuyLogic")
local YunYingLogic = require("yunying.YunYingLogic")

-- db.tuiSongLiBao.libao[id] = { 
-- 	activeTime 激活时间
--	isBuy 是否购买
--	activeCnt 触发次数
-- }
-- db.tuiSongLiBao.task[taskId] = {
-- 	finCnt 完成次数
-- }

TUISONGLIBAOTASK_LV = 1 --玩家到达x级别
TUISONGLIBAOTASK_STARS_HERO = 2 --获得x星武将
TUISONGLIBAOTASK_ZHAOJIANG = 3 --召将达到x次
TUISONGLIBAOTASK_ZHENGZHAN = 4 --通关关卡（x）
TUISONGLIBAOTASK_TOWER = 5 --通关通天塔（x）层
TUISONGLIBAOTASK_ZHUANPAN = 6 --许愿（x）次

local function getLeftTimeByID(human,id)
	local tuiSongLiBaoDB = human.db.tuiSongLiBao
	if not tuiSongLiBaoDB or 
		not tuiSongLiBaoDB.libao or 
		not tuiSongLiBaoDB.libao[id] then return 0 end

	local config = PresentExcel.tuiSongLiBao[id]
	local activeTime = tuiSongLiBaoDB.libao[id].activeTime
	local leftTime = (activeTime + config.canBuyTime) - os.time()

	if leftTime < 0 then
		leftTime = 0
	end

	return leftTime
end

local function getMinLeftTime(human)
	local tuiSongLiBaoDB = human.db.tuiSongLiBao
	if not tuiSongLiBaoDB or 
		not tuiSongLiBaoDB.libao then return end

	local min = nil
	for id,data in pairs(tuiSongLiBaoDB.libao) do
		if not data.isBuy then
			local leftTime = getLeftTimeByID(human,id)
			if leftTime > 0 then
				if not min then
					min = leftTime
				end

				if min > leftTime then
					min = leftTime
				end
			end
		end
	end

	return min
end

local function isBuy(human,id)
	local tuiSongLiBaoDB = human.db.tuiSongLiBao
	if not tuiSongLiBaoDB or 
		not tuiSongLiBaoDB.libao or 
		not tuiSongLiBaoDB.libao[id] then return end

	return tuiSongLiBaoDB.libao[id].isBuy
end

local function makeTuiSongLiBaoNet(human,id,net)
	net.leftTime = getLeftTimeByID(human,id)
	
	local config = PresentExcel.tuiSongLiBao[id]
	net.desc = config.desc
	net.reward[0] = #config.reward
	for i=1,#config.reward do
		local itemID = config.reward[i][1]
		local itemCnt = config.reward[i][2]
		Grid.makeItem(net.reward[i], itemID, itemCnt)
	end
	net.bg = config.bg
	net.fanli = config.fanli
	net.isBuy = isBuy(human,id) and 1 or 0
	net.id = id
	net.giftVipExp = config.vipExp
	net.type = config.task[1]
	BuyLogic.fontBuyItem(human,net.buyItem, config.buyID)
end

function CG_PRESENT_TUISONGLIBAO_QUERY(human)
	ObjHuman.updateDaily(human)

	local tuiSongLiBaoDB = human.db.tuiSongLiBao
	if not tuiSongLiBaoDB or 
		not tuiSongLiBaoDB.libao then return end

	local minLeftTime = getMinLeftTime(human)
	if not minLeftTime then return end

	local msgRet = Msg.gc.GC_PRESENT_TUISONGLIBAO_QUERY
	msgRet.libao[0] = 0
	for id in pairs(tuiSongLiBaoDB.libao) do
		if msgRet.libao[0] < #msgRet.libao then
			local leftTime = getLeftTimeByID(human,id)
			if leftTime > 0 then
				msgRet.libao[0] = msgRet.libao[0] + 1
				makeTuiSongLiBaoNet(human,id,msgRet.libao[msgRet.libao[0]])
			end
		end
	end
	--Msg.trace(msgRet)
	Msg.send(msgRet,human.fd)
end

function tuiSongLiBaoBuy(human,id)
	ObjHuman.updateDaily(human)

	local config = PresentExcel.tuiSongLiBao[id]
	if not config then return end

	local tuiSongLiBaoDB = human.db.tuiSongLiBao
	if not tuiSongLiBaoDB 
		or not tuiSongLiBaoDB.libao 
		or not tuiSongLiBaoDB.libao[id] then return end

	local leftTime = getLeftTimeByID(human,id)
	if leftTime <= 0 then
	 	return Broadcast.sendErr(human,Lang.PRESENT_TUISONGLIBAO_NOTBUY)
	end

	if isBuy(human,id) then return end

	human.db.tuiSongLiBao = human.db.tuiSongLiBao or {}
	human.db.tuiSongLiBao.libao = human.db.tuiSongLiBao.libao or {}
	human.db.tuiSongLiBao.libao[id] = human.db.tuiSongLiBao.libao[id] or {}
	human.db.tuiSongLiBao.libao[id].isBuy = (human.db.tuiSongLiBao.libao[id].isBuy or 0) + 1

	BagLogic.addItemList(human, config.reward, "tuisong_liBao")
	Broadcast.sendErr(human, Lang.ITEM_BUY_SUCCESS)

	local msgRet = Msg.gc.GC_PRESENT_TUISONGLIBAO_BUY
	msgRet.id = id
	Msg.send(msgRet,human.fd)
end

local function getLiBaoData(human,id)
	local tuiSongLiBaoDB = human.db.tuiSongLiBao
	if not tuiSongLiBaoDB or not tuiSongLiBaoDB.libao then return end

	return tuiSongLiBaoDB.libao[id]
end

local function getLiBaoActiveCnt(human,id)
	local data = getLiBaoData(human,id)
	return data and data.activeCnt or 0
end

local function checkLiBaoCanActive(human,id)
	local libaoActiveCnt = getLiBaoActiveCnt(human,id)
	local config = PresentExcel.tuiSongLiBao
	if config[id].dayActiveCnt > libaoActiveCnt then
		return true
	end
end

local function libaoMake(human,id)
	human.db.tuiSongLiBao = human.db.tuiSongLiBao or {}
	human.db.tuiSongLiBao.libao = human.db.tuiSongLiBao.libao or {}
	human.db.tuiSongLiBao.libao[id] = human.db.tuiSongLiBao.libao[id] or {}
	human.db.tuiSongLiBao.libao[id].activeTime = os.time()
	human.db.tuiSongLiBao.libao[id].activeCnt = (human.db.tuiSongLiBao.libao[id].activeCnt or 0) + 1
	human.db.tuiSongLiBao.libao[id].isBuy = nil
end

local function checkTaskSucess(human, config, arg, arg2)
	local taskType = config.task[1]
	local cntNeed = config.task[2]
	if taskType == TUISONGLIBAOTASK_STARS_HERO then
		-- 星级
		if arg == cntNeed then 
			return true
		end
	elseif taskType == TUISONGLIBAOTASK_LV then
		-- 等级
		local cntNew = arg
		local cntOld = arg2
		if cntNew >= cntNeed and cntOld < cntNeed then
			return true
		end
	elseif taskType == TUISONGLIBAOTASK_ZHAOJIANG then
		-- 招将次数
		local cntNew = human.db.tuiSongLiBao.task[taskType] or 0
		local cntOld = cntOld - arg
		if cntNew >= cntNeed and cntOld < cntNeed then
			return true
		end
	elseif taskType == TUISONGLIBAOTASK_ZHENGZHAN then
		-- 征战
		local cntNew = arg
		local cntOld = arg2
		if cntNew >= cntNeed and cntOld < cntNeed then
			return true
		end
	elseif taskType == TUISONGLIBAOTASK_TOWER then
		-- 爬塔
		local cntNew = arg
		local cntOld = arg2
		if cntNew >= cntNeed and cntOld < cntNeed then
			return true
		end
	elseif taskType == TUISONGLIBAOTASK_ZHUANPAN then
		-- 转盘次数
		local cntNew = human.db.tuiSongLiBao.task[taskType] or 0
		local cntOld = cntOld - arg
		if cntNew >= cntNeed and cntOld < cntNeed then
			return true
		end
	else
		assert(nil)
	end
end

function tuiSongLiBaoOnTask(human,taskType,arg, arg2)
	do return end
	if taskType == nil then 
		assert(nil)
	end

	ObjHuman.updateDaily(human)

	local taskTypeConfig = PresentExcel.tuiSongLiBaoTask[taskType]
	if taskTypeConfig.needSaveDB == 1 then
		human.db.tuiSongLiBao = human.db.tuiSongLiBao or {}
		human.db.tuiSongLiBao.task = human.db.tuiSongLiBao.task or {}
		human.db.tuiSongLiBao.task[taskType] = (human.db.tuiSongLiBao.task[taskType] or 0) + arg
	end

	local isActive = nil
	for id, config in pairs(PresentExcel.tuiSongLiBao) do
		if config.task[1] == taskType then
			if checkTaskSucess(human, config, arg, arg2) then
				local canActive = checkLiBaoCanActive(human,id)
				local leftTime = getLeftTimeByID(human,id)
				if canActive and leftTime <= 0 then
					libaoMake(human,id)
					isActive = true

					local msgRet = Msg.gc.GC_PRESENT_TUISONGLIBAO_QUERY
					msgRet.libao[0] = 1
					makeTuiSongLiBaoNet(human,id,msgRet.libao[1])
					--Msg.trace(msgRet)
					Msg.send(msgRet,human.fd)
				end
			end
		
		end
	end

	if isActive then
		for k, v in pairs(funcID) do
            YunYingLogic.updateIcon(YYInfo[k], human,true)
            break
        end
	end
end

function updateDaily(human)
	local tuiSongLiBaoDB = human.db.tuiSongLiBao
	if not tuiSongLiBaoDB then return end
	
	human.db.tuiSongLiBao.task = nil
	
	if not tuiSongLiBaoDB.libao then return end

	for id,data in pairs(tuiSongLiBaoDB.libao) do
		local leftTime = getLeftTimeByID(human,id)
		if leftTime > 0 then
			human.db.tuiSongLiBao.libao[id].activeCnt = nil
		else
			human.db.tuiSongLiBao.libao[id] = nil
		end
	end
end

function isOpen(human)
	local min = getMinLeftTime(human)
	if min and min > 0 then return true end
end

-- function isRed(human)
-- 	local min = getMinLeftTime(human)
-- 	if min and min > 0 then return true end
-- end

function getLeftTime(human, YYInfo)
	if not YYInfo then return 0 end

	local min = getMinLeftTime(human)
	return min or 0
end